Atomic Arrays হল Java এর java.util.concurrent.atomic প্যাকেজের একটি ফিচার যা atomic operations এর মাধ্যমে একটি অ্যারের উপাদানগুলোকে থ্রেড-সেফভাবে পরিচালনা করতে ব্যবহৃত হয়। এটি AtomicIntegerArray, AtomicLongArray, এবং AtomicReferenceArray এর মতো ক্লাস সরবরাহ করে।
এই ক্লাসগুলোতে এমন মেথড রয়েছে যা একাধিক থ্রেডের মধ্যে synchronization ছাড়াই কাজ করতে পারে। এর ফলে মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে ডেটা সঠিকতা বজায় রাখা সহজ হয়।
গুরুত্বপূর্ণ মেথডসমূহ এবং তাদের কার্যপ্রণালী
১. get(index)
এই মেথডটি অ্যারের একটি নির্দিষ্ট index এর মান পড়ে।
এটি থ্রেড-সেফ।
AtomicIntegerArray atomicArray = new AtomicIntegerArray(5);
atomicArray.set(0, 10); // Index 0 তে 10 সেট করা
System.out.println(atomicArray.get(0)); // আউটপুট: 10
২. set(index, value)
এই মেথডটি অ্যারের একটি নির্দিষ্ট index এ একটি নতুন মান সেট করে।
এটি থ্রেড-সেফ এবং atomic।
AtomicIntegerArray atomicArray = new AtomicIntegerArray(5);
atomicArray.set(1, 20); // Index 1 এ 20 সেট করা
System.out.println(atomicArray.get(1)); // আউটপুট: 20
৩. getAndAdd(index, delta)
এই মেথডটি অ্যারের একটি নির্দিষ্ট index এর বর্তমান মান রিটার্ন করে এবং তারপর একটি নির্দিষ্ট delta মান যোগ করে।
এটি থ্রেড-সেফ এবং atomic।
AtomicIntegerArray atomicArray = new AtomicIntegerArray(5);
atomicArray.set(2, 30); // Index 2 তে 30 সেট করা
int previousValue = atomicArray.getAndAdd(2, 5); // 5 যোগ করার আগে পুরানো মান রিটার্ন করবে
System.out.println("Previous Value: " + previousValue); // আউটপুট: 30
System.out.println("Updated Value: " + atomicArray.get(2)); // আউটপুট: 35
৪. compareAndSet(index, expectedValue, newValue)
এই মেথডটি একটি নির্দিষ্ট index এর মান পরীক্ষা করে এবং যদি সেটি expectedValue এর সমান হয়, তবে এটি newValue তে আপডেট করে। সফল হলে এটি true রিটার্ন করে, অন্যথায় false।
এটি থ্রেড-সেফ এবং atomic।
AtomicIntegerArray atomicArray = new AtomicIntegerArray(5);
atomicArray.set(3, 40); // Index 3 এ 40 সেট করা
boolean isUpdated = atomicArray.compareAndSet(3, 40, 50); // যদি 40 হয়, তবে 50 তে আপডেট করবে
System.out.println("Update Successful: " + isUpdated); // আউটপুট: true
System.out.println("Updated Value: " + atomicArray.get(3)); // আউটপুট: 50
Atomic Arrays এর বৈশিষ্ট্য
- Thread-Safe Operations: একাধিক থ্রেডের মধ্যে ডেটা পরিবর্তন সঠিকভাবে সম্পন্ন হয়।
- Non-blocking Mechanism: CAS (Compare-And-Swap) মেকানিজম ব্যবহার করে ডেটা আপডেট করে, যা লক-মুক্ত এবং পারফরম্যান্স বৃদ্ধিতে কার্যকর।
- Immutable Index: অ্যারের ইনডেক্স স্থির (immutable), তাই একাধিক থ্রেড একই ইনডেক্সে কাজ করলেও ডেটা সঠিক থাকে।
উদাহরণ: AtomicIntegerArray এর ব্যবহার
import java.util.concurrent.atomic.AtomicIntegerArray;
public class AtomicArrayExample {
public static void main(String[] args) {
// Atomic Array তৈরি
AtomicIntegerArray atomicArray = new AtomicIntegerArray(5);
// মান সেট করা
atomicArray.set(0, 10);
atomicArray.set(1, 20);
atomicArray.set(2, 30);
// get() ব্যবহার
System.out.println("Index 1 Value: " + atomicArray.get(1)); // আউটপুট: 20
// getAndAdd() ব্যবহার
System.out.println("Index 2 Old Value: " + atomicArray.getAndAdd(2, 5)); // আউটপুট: 30
System.out.println("Index 2 New Value: " + atomicArray.get(2)); // আউটপুট: 35
// compareAndSet() ব্যবহার
boolean isUpdated = atomicArray.compareAndSet(1, 20, 50); // যদি 20 হয়, তবে 50 তে আপডেট করবে
System.out.println("Compare-And-Set Successful: " + isUpdated); // আউটপুট: true
System.out.println("Index 1 New Value: " + atomicArray.get(1)); // আউটপুট: 50
}
}
Atomic Arrays এর সুবিধা
- Thread-safe Reads এবং Writes: একাধিক থ্রেডের ক্ষেত্রে ডেটা নিরাপদ থাকে।
- Lock-Free Synchronization: লক ব্যবহার ছাড়াই ডেটা ম্যানিপুলেশন করা যায়।
- High Performance: Synchronization blocks বা locks এর তুলনায় দ্রুত কাজ করে।
Atomic Arrays এর সীমাবদ্ধতা
- Fixed Size: Atomic Arrays এর আকার একবার নির্ধারণ করার পর পরিবর্তন করা যায় না।
- Single Type: প্রতিটি অ্যারে শুধুমাত্র একটি নির্দিষ্ট ডেটা টাইপ (যেমন Integer, Long) ধারণ করতে পারে।
- Complex Logic: জটিল লজিক বা ডেটা স্ট্রাকচার ব্যবহারের ক্ষেত্রে অতিরিক্ত ব্যবস্থাপনার প্রয়োজন হতে পারে।
উপসংহার
Atomic Arrays মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে ডেটা ম্যানিপুলেশনের সময় synchronization এবং atomicity নিশ্চিত করার জন্য একটি কার্যকর সমাধান। এর মেথডগুলো যেমন get(), set(), getAndAdd(), এবং compareAndSet() মাল্টি-থ্রেডিংয়ের চ্যালেঞ্জ মোকাবিলায় বিশেষ ভূমিকা রাখে। এটি উচ্চ-পারফরম্যান্স অ্যাপ্লিকেশন এবং ডেটা সঠিকতা বজায় রাখার জন্য অত্যন্ত উপযোগী।
Read more